package DAO;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.HibernateUtil;
import TO.LivroTO;
import TO.UsuarioTO;

public class LivroDAO {
	
	public LivroDAO(){
	}
	
	public static Integer inserir(LivroTO livro) {
		
		Serializable id;
		
		try {
			Session sessao = HibernateUtil.getSession();
						
			Transaction transaction = sessao.beginTransaction();
			id = sessao.save(livro);        
	          
			transaction.commit();
			sessao.close();
			
			
		} catch(Exception e){
			System.out.println(e.getMessage());
			id = 0;
		}	
		
		return Integer.parseInt(id.toString());	
	}
	
	public static boolean atualizar(LivroTO livro) {
		
		try {
			Session sessao = HibernateUtil.getSession();
						
			Transaction transaction = sessao.beginTransaction();
			sessao.update(livro);
			
			transaction.commit();
			sessao.close();
			
			return true;
			
		} catch(Exception e){
			System.out.println(e.getMessage());
			return false;
		}		
	}
	
	public static boolean deletar(LivroTO livro) {
		
		try {
			Session sessao = HibernateUtil.getSession();
						
			Transaction transaction = sessao.beginTransaction();
			sessao.delete(livro);
			
			transaction.commit();
			sessao.close();
			
			return true;
			
		} catch(Exception e){
			System.out.println(e.getMessage());
			return false;
		}		
	}
	
	/**
	 * 
	 * @param titulo
	 * @return List<LivroTO>
	 */
	public static List<LivroTO>  consultar(String titulo1){
		String titulo = "%"+titulo1+"%";
		List<LivroTO> lista = new ArrayList<LivroTO>(); 
		try {
			Session session = HibernateUtil.getSession();  
		    
		    lista = session.createQuery("from LivroTO where titulo like ?")
	    	.setString(0, titulo)
	    	.list();
			
		    session.close();
			
		} catch(Exception e)
			{System.out.println(e.getMessage());
		}
		
		return lista;
	}
	
	public static LivroTO  consultar(int id){
		
		List<LivroTO> lista = new ArrayList<LivroTO>(); 
		LivroTO livro;
		try {
			Session session = HibernateUtil.getSession();  
		    
		    lista = session.createQuery("from LivroTO where id=?")
	    	.setInteger(0, id)
	    	.list();
			
		    session.close();
		    livro = lista.get(0);
			
		} catch(Exception e)
			{
			livro = null;
			System.out.println(e.getMessage());
		}
		
		return livro;
	}
	
	public static List<LivroTO>  listar(){
		
	    List<LivroTO> lista = new ArrayList<LivroTO>(); 
	    
		try {
		    Session session = HibernateUtil.getSession();  
		    
		    lista = session.createQuery("from LivroTO")
	    	.list();
			
		    session.close();
		    
		} catch(Exception e)
			{System.out.println(e.getMessage());
		}
		
		return lista;
	}
	
	
	/*public int emprestar(String codigo, Boolean emprestado, String prontuario, Date dataEmprestimo, Date dataDevolucao) {
		Connection con=null;
		Statement stmt =null;
		int result = 0;
		String comando = "UPDATE LIVROS SET" +
				" EMPRESTADO='" + emprestado + "', PRONTUARIO_USUARIO=" + prontuario + ", DATA_EMPRESTIMO='" + dataEmprestimo + 
				"', DATA_DEVOLUCAO='" + dataDevolucao + "' WHERE CODIGO = '"	+ codigo + "'";
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			result = stmt.executeUpdate(comando);
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return result;
	}
	


	public LivroTO  consultarLivroCompleto(String codigo){
		LivroTO livro=null;
		Connection con=null;
		Statement stmt =null;
		
		String comando = "SELECT * FROM LIVROS WHERE CODIGO ='"+codigo+"'";
		
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(comando);		// usado para fazer consultas ao banco
			if(rs.next()) {
				livro = new LivroTO();
				livro.setCodigo(rs.getString("CODIGO"));
				livro.setTitulo(rs.getString("TITULO"));
				livro.setAutor(rs.getString("AUTOR"));
				livro.setCodigoEditora(rs.getString("CODIGO_EDITORA"));
				livro.setCodigoCategoria(rs.getString("CODIGO_CATEGORIA"));
				livro.setEmprestado(rs.getBoolean("EMPRESTADO"));
				livro.setProntuario(rs.getString("PRONTUARIO_USUARIO"));
				livro.setDataEmprestimo(rs.getDate("DATA_EMPRESTIMO"));
				livro.setDataDevolucao(rs.getDate("DATA_DEVOLUCAO"));
				
			}
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return livro;
	}
	
	public LivroTO  consultarLivro(String codigo){
		LivroTO livro=null;
		Connection con=null;
		Statement stmt =null;
		
		String comando = "SELECT * FROM LIVROS WHERE CODIGO ='"+codigo+"'";
		
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(comando);		// usado para fazer consultas ao banco
			if(rs.next()) {
				livro = new LivroTO();
				livro.setCodigo(rs.getString("CODIGO"));
				livro.setTitulo(rs.getString("TITULO"));
				livro.setAutor(rs.getString("AUTOR"));
				livro.setCodigoEditora(rs.getString("CODIGO_EDITORA"));
				livro.setCodigoCategoria(rs.getString("CODIGO_CATEGORIA"));
				livro.setEmprestado(rs.getBoolean("EMPRESTADO"));
			}
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return livro;
	}

	public Collection<LivroTO>  emprestados(){
		
		Connection con=null;
		Statement stmt =null;
		
		Collection<LivroTO> list = new ArrayList<LivroTO>();
		String comando = "SELECT * FROM LIVROS WHERE EMPRESTIMO = 'TRUE'";
		
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(comando);		// usado para fazer consultas ao banco
			while(rs.next()) {
				LivroTO livro = new LivroTO();
				livro.setCodigo(rs.getString("CODIGO"));
				livro.setTitulo(rs.getString("TITULO"));
				livro.setAutor(rs.getString("AUTOR"));
				livro.setCodigoEditora(rs.getString("CODIGO_EDITORA"));
				livro.setCodigoCategoria(rs.getString("CODIGO_CATEGORIA"));
				livro.setEmprestado(rs.getBoolean("EMPRESTADO"));
				livro.setProntuario(rs.getString("PRONTUARIO_USUARIO"));
				livro.setDataEmprestimo(rs.getDate("DATA_EMPRESTIMO"));
				livro.setDataDevolucao(rs.getDate("DATA_DEVOLUCAO"));
				list.add(livro);
			}
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return list;
	}
	
	public Collection<LivroTO>  atrasados(Date dataDevolucao){
		
		Connection con=null;
		Statement stmt =null;
		
		Collection<LivroTO> list = new ArrayList<LivroTO>();
		String comando = "SELECT * FROM LIVROS WHERE DATA_DEVOLUCAO < '" + dataDevolucao + "'";
		
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(comando);		// usado para fazer consultas ao banco
			while(rs.next()) {
				LivroTO livro = new LivroTO();
				livro.setCodigo(rs.getString("CODIGO"));
				livro.setTitulo(rs.getString("TITULO"));
				livro.setAutor(rs.getString("AUTOR"));
				livro.setCodigoEditora(rs.getString("CODIGO_EDITORA"));
				livro.setCodigoCategoria(rs.getString("CODIGO_CATEGORIA"));
				livro.setEmprestado(rs.getBoolean("EMPRESTADO"));
				livro.setProntuario(rs.getString("PRONTUARIO_USUARIO"));
				livro.setDataEmprestimo(rs.getDate("DATA_EMPRESTIMO"));
				livro.setDataDevolucao(rs.getDate("DATA_DEVOLUCAO"));
				list.add(livro);
			}
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return list;
	}

	public Date consultaDevolver(String codigo) {
		Connection con=null;
		Statement stmt =null;
		Date devolucao = null;
		
		String comando = "SELECT DATA_DEVOLUCAO FROM LIVROS WHERE CODIGO ='"+codigo+"'";
		
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(comando);		// usado para fazer consultas ao banco
			
			devolucao = rs.getDate("DATA_DEVOLUCAO");
			
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return devolucao;
	}
	
	public static Collection<LivroTO>  consultar(){
		
		Connection con=null;
		Statement stmt =null;
		
		Collection<LivroTO> list = new ArrayList<LivroTO>();
		String comando = "SELECT * FROM LIVROS";
		
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(comando);		// usado para fazer consultas ao banco
			while(rs.next()) {
				LivroTO livro = new LivroTO();
				livro.setCodigo(rs.getString("CODIGO"));
				livro.setTitulo(rs.getString("TITULO"));
				livro.setAutor(rs.getString("AUTOR"));
				livro.setCodigoEditora(rs.getString("CODIGO_EDITORA"));
				livro.setCodigoCategoria(rs.getString("CODIGO_CATEGORIA"));
				livro.setEmprestado(rs.getBoolean("EMPRESTADO"));
				livro.setProntuario(rs.getString("PRONTUARIO_USUARIO"));
				livro.setDataEmprestimo(rs.getDate("DATA_EMPRESTIMO"));
				livro.setDataDevolucao(rs.getDate("DATA_DEVOLUCAO"));
				list.add(livro);
			}
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return list;
	}
	
public static Collection<LivroTO>  consultarEmprestados(){
		
		Connection con=null;
		Statement stmt =null;
		
		Collection<LivroTO> list = new ArrayList<LivroTO>();
		String comando = "SELECT * FROM LIVROS WHERE EMPRESTIMO = 'TRUE'";
		
		try {
			con=ConnectionDAO.getInstance().getConnection();
			stmt = con.createStatement();
			ResultSet rs = stmt.executeQuery(comando);		// usado para fazer consultas ao banco
			while(rs.next()) {
				LivroTO livro = new LivroTO();
				livro.setCodigo(rs.getString("CODIGO"));
				livro.setTitulo(rs.getString("TITULO"));
				livro.setAutor(rs.getString("AUTOR"));
				livro.setCodigoEditora(rs.getString("CODIGO_EDITORA"));
				livro.setCodigoCategoria(rs.getString("CODIGO_CATEGORIA"));
				livro.setEmprestado(rs.getBoolean("EMPRESTADO"));
				livro.setProntuario(rs.getString("PRONTUARIO_USUARIO"));
				livro.setDataEmprestimo(rs.getDate("DATA_EMPRESTIMO"));
				livro.setDataDevolucao(rs.getDate("DATA_DEVOLUCAO"));
				list.add(livro);
			}
		} catch(Exception e){System.out.println(e.getMessage());}
		finally {
			ConnectionDAO.getInstance().devolveConnection(con);
			try{stmt.close();}catch(Exception ee){};
		}
		
		return list;
	}*/

}
